﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Persistencia
{
    public class UserPersistence
    {

        public void InsertarUsuario(Usuario usuario)
        {  
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                mydb.Usuario.AddObject(usuario);
                mydb.SaveChanges();
            }
        }

        public void InsertarRolesUsuario(int idUsuario, List<int> rolIds)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                Usuario usuario = mydb.Usuario.FirstOrDefault(u => u.Id == idUsuario);
                foreach (int id in rolIds)
                {
                    int id1 = id;
                    Rol rol = mydb.Rol.First(r => r.Id == id1);
                    usuario.Rol.Add(rol);
                }
                mydb.SaveChanges();
            }          
        }

        public void EliminarRolesUsuario(int idUsuario, List<int> rolIds)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                Usuario usuario = mydb.Usuario.FirstOrDefault(u => u.Id == idUsuario);
                foreach (int id in rolIds)
                {
                    int id1 = id;
                    Rol rol = mydb.Rol.First(r => r.Id == id1);
                    usuario.Rol.Remove(rol);
                }
                mydb.SaveChanges();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idUsuario"></param>
        public void EliminarUsuario(int idUsuario)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                Usuario user = mydb.Usuario.First(u => u.Id == idUsuario);
                user.Activo = false;
                mydb.SaveChanges();
            }         
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public Usuario GetUsuarioByUserName(String userName)
        {
            Usuario usuario;
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                usuario = mydb.Usuario.FirstOrDefault(u => u.Nombre_Usuario == userName);
                if (usuario != null)
                {
                    usuario.Rol.Load();
                    foreach (Rol rol in usuario.Rol)
                    {
                        rol.Funcionalidad.Load();
                    }
                }

            }

            return usuario;
        }

        public Usuario GetUsuarioById(int idUsuario)
        {
            Usuario usuario;
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                usuario = mydb.Usuario.FirstOrDefault(u => u.Id == idUsuario);
                usuario.Rol.Load();
            }

            return usuario;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="usuario"></param>
        public void ModificarUsuario(Usuario usuario)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                Usuario edit = mydb.Usuario.FirstOrDefault(u => u.Id == usuario.Id);
                edit.Nombre = usuario.Nombre;
                edit.Apellido = usuario.Apellido;
                edit.Contraseña = usuario.Contraseña;
                edit.Correo = usuario.Correo;
                edit.Activo = usuario.Activo;
                edit.Cantidad_Veces_Loguea = usuario.Cantidad_Veces_Loguea;
                mydb.SaveChanges();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idUsuario"></param>
        /// <param name="busqueda"></param>
        public void InsertarBusqueda(int idUsuario, Busqueda busqueda)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                Usuario user = mydb.Usuario.FirstOrDefault(u => u.Id == idUsuario);
                busqueda.Usuario1Reference.Value = user;

                mydb.Busqueda.AddObject(busqueda);
                mydb.SaveChanges();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idBusqueda"></param>
        public void EliminarBusqueda(int idBusqueda)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                mydb.DeleteObject(mydb.Busqueda.First(b => b.Id == idBusqueda));
                mydb.SaveChanges();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idUsuario"></param>
        /// <returns></returns>
        public List<Busqueda> SelectBusquedasDeUsuario(int idUsuario)
        {
            using (SearchDBEntities mydb = new SearchDBEntities())
            {
                List<Busqueda> busquedasAux = mydb.Busqueda.ToList();
                var query = from b in busquedasAux
                            where b.Usuario == idUsuario
                            select b;
                List<Busqueda> busquedas = query.ToList();
                return busquedas;
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public List<Usuario> SelectUsuarios()
        {
            List<Usuario> usuarios;

            using (SearchDBEntities myDb = new SearchDBEntities())
            {
                usuarios = myDb.Usuario.ToList();
            }

            return usuarios;
        }

        public List<Rol> ObtenerRolesActivos()
        {
            using (SearchDBEntities myDb = new SearchDBEntities())
            {
                var query = from r in myDb.Rol
                            where r.Activo == true
                            select r;
                return query.ToList();
            }
        }

        public List<int> ObtenerRolesPorNombe(List<string> roles)
        {
            using (SearchDBEntities myDb = new SearchDBEntities())
            {
                List<int> lista = new List<int>();
                foreach(string rol in roles)
                {
                    var query = from r in myDb.Rol
                                where r.Nombre == rol
                                select r;
                    foreach(Rol q in query.ToList())
                    {
                        lista.Add(q.Id);
                    }
                }
                return lista;
            }
        }
    }
}
